{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Вопросы для повторения:**\n",
    "* `sizeof(unique_ptr)`\n",
    "* как устроен `shared_ptr` внутри? Внутри внутренностей? (в варианте реализации, рассматриваемой на лекции)\n",
    "\n",
    "<details>\n",
    "<summary>Подсказка</summary>\n",
    "<p>\n",
    "\n",
    "Указатель на объект и на control block.\n",
    "\n",
    "Внутри control block:\n",
    "* shared_counter\n",
    "* weak_counter\n",
    "* указатель на объект\n",
    "* custom deleter\n",
    "* custom allocator\n",
    "* ...\n",
    "\n",
    "</p>\n",
    "</details>\n",
    "\n",
    "* Когда удаляется объект, владеемый по `shared_ptr`?\n",
    "* Когда удаляется control block?\n",
    "* в чём здесь проблема? как исправить?\n",
    "\n",
    "```c++\n",
    "std::vector<std::shared_ptr<Cat>> herd;\n",
    "herd.reserve(100);\n",
    "for (int i = 0; i < 100; ++i)\n",
    "    herd.push_back(std::shared_ptr<Cat>(new Cat()));\n",
    "```\n",
    "\n",
    "если исправить, что поменяется во внутренней организации?\n",
    "\n",
    "* в чём здесь проблема? как исправить?\n",
    "\n",
    "```c++\n",
    "std::unique_ptr<House> create_house(std::unique_ptr<Floor> floor,\n",
    "                                    std::unique_ptr<Roof> roof,\n",
    "                                    std::unique_ptr<Wall> wall_l,\n",
    "                                    std::unique_ptr<Wall> wall_r,\n",
    "                                    std::unique_ptr<Wall> wall_f,\n",
    "                                    std::unique_ptr<Wall> wall_b);\n",
    "\n",
    "auto house = create_house(std::unique_ptr<Floor>(new Floor),\n",
    "                          std::unique_ptr<Roof>(new Roof),\n",
    "                          std::unique_ptr<Wall>(new Wall),\n",
    "                          std::unique_ptr<Wall>(new Wall),\n",
    "                          std::unique_ptr<Wall>(new Wall),\n",
    "                          std::unique_ptr<Wall>(new Wall));\n",
    "```\n",
    "\n",
    "* в чём здесь проблема? как исправить?\n",
    "\n",
    "```c++\n",
    "void happy_birthday(std::shared_ptr<Person> person) {\n",
    "    ++person->age;\n",
    "    \n",
    "    std::cout << \"Happy birthday to \" << person->name << std::endl;\n",
    "}\n",
    "```\n",
    "\n",
    "* что такое RVO / NRVO / copy elision простыми словами?\n",
    "* Какие рекомендации по возвращению объекта из функции?\n",
    "\n",
    "<details>\n",
    "<summary>Ответ</summary>\n",
    "<p>\n",
    "\n",
    "```c++\n",
    "предпочтительнее конструировать объект в return, чтобы отработал copy elision, компилятор его гарантирует\n",
    "\n",
    "  House build() {\n",
    "      ...\n",
    "      return House(...);\n",
    "  }\n",
    "если без именованного объекта не обойтись, желательно заиспользовать NRVO (и молиться на добрую волю компилятора)\n",
    "\n",
    "  House build(bool stone) {\n",
    "      House house;\n",
    "      if (stone) {\n",
    "          ... // setup stone house\n",
    "      } else {\n",
    "          ... // setup another house\n",
    "      }\n",
    "      return house;\n",
    "  }\n",
    "```\n",
    "\n",
    "</p>\n",
    "</details>\n",
    "\n",
    "* как будем передавать параметры и возвращать значение?\n",
    "  * функция считает кол-во символов `char c` в `std::string s`\n",
    "  * функция возвращает длину радиус-вектора точки:\n",
    "  \n",
    "  ```c++\n",
    "  struct Point\n",
    "  {\n",
    "      double x;\n",
    "      double y;\n",
    "      double z;\n",
    "  };\n",
    "  ```\n",
    "  \n",
    "  * функция возвращает длину радиус-вектора взвешенной точки:\n",
    "  \n",
    "  ```c++\n",
    "  struct WeightedPoint\n",
    "  {\n",
    "      double x;\n",
    "      double y;\n",
    "      double z;\n",
    "      double w;\n",
    "  };\n",
    "  ```"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
